package com.learn.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ExecutionAop {

    @Before("execution(public * com.learn..*(..))")
    public void executePublicAll(){
        System.out.println("匹配com.learn包下面任何公共方法的执行");
    }

    /* 貌似私有方法无效 */
    @Before("execution(private * com.learn..*(..))")
    public void executePrivateAll(){
        System.out.println("匹配com.learn包下面任何私有方法的执行");
    }

    @Before("execution(* com.learn..IHelloService.*())")
    public void execute2(){
        System.out.println("com.learn包及所有子包下IHelloService接口中的任何无参方法");
    }

    @Before("execution(@java.lang.Deprecated * *(..))")
    public void execute3(){
        System.out.println("任何持有@java.lang.Deprecated注解的方法");
    }

    @Before("execution(@(java.lang.Deprecated || com.learn..Secure) * *(..))")
    public void execute4(){
        System.out.println("任何持有@java.lang.Deprecated或@com.learn..Secure注解的方法");
    }

    @Before("execution((@com.learn..Secure  *) *(..))")
    public void execute5(){
        System.out.println("任何返回值类型持有@com.learn..Secure的方法");
    }

    @Before("execution(* com.learn..IHelloService*.test*(java.util.Date))")
    public void execute6(){
        System.out.println("com.learn包及所有子包下IHelloService前缀类型的的以test开头的只有一个参数类型为java.util.Date的方法，注意该匹配是根据方法签名的参数类型进行匹配的，而不是根据执行时传入的参数类型决定的，如定义方法：public void test(Object obj);即使执行时传入java.util.Date，也不会匹配的；");
    }

    @Before("execution(* (com.learn..* && (!com.learn..IHelloService+)).*(..))")
    public void execute7(){
        System.out.println("非“com.learn包及所有子包下IHelloService接口及子类型”的任何方法");
    }

}
